# Copyright 2016 The V8 project authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("../../gni/v8.gni")

config("cctest_config") {
  # Work around a bug in the gold linker.
  if (use_gold && target_cpu == "x86") {
    ldflags = [ "-Wl,--icf=none" ]
  }
}

v8_executable("cctest") {
  testonly = true

  sources = [ "cctest.cc" ]

  deps = [
    ":cctest_sources",
    "../..:v8_for_testing",
    "../..:v8_libbase",
    "../..:v8_libplatform",
    "../../tools/debug_helper:v8_debug_helper",
  ]

  data_deps = [ "../../tools:v8_testrunner" ]

  data = [
    "testcfg.py",
    "cctest.status",
  ]

  configs = [
    "../..:external_config",
    "../..:internal_config_base",
    "../..:v8_tracing_config",
    ":cctest_config",
  ]

  ldflags = []

  if (v8_use_perfetto) {
    deps += [
      # TODO(skyostil): Switch the test to use protozero.
      "//third_party/perfetto/protos/perfetto/trace/interned_data:lite",
      "//third_party/perfetto/protos/perfetto/trace/track_event:lite",
    ]
  }

  if (current_os == "aix") {
    ldflags = [ "-Wl,-bbigtoc" ]
  }
}

v8_header_set("cctest_headers") {
  testonly = true

  configs = [
    "../..:external_config",
    "../..:internal_config_base",
  ]

  deps = [
    "../..:v8_internal_headers",
    "../..:v8_libbase",
    "../..:v8_libplatform",
  ]

  sources = [ "cctest.h" ]
}

config("cctest_sources_config") {
  if (is_clang) {
    cflags = [ "-Wno-string-concatenation" ]
  }
}

v8_source_set("cctest_sources") {
  testonly = true

  sources = [
    ### gcmole(all) ###
    "../common/assembler-tester.h",
    "../common/c-signature.h",
    "../common/call-tester.h",
    "../common/code-assembler-tester.h",
    "../common/flag-utils.h",
    "../common/node-observer-tester.h",
    "../common/value-helper.cc",
    "../common/value-helper.h",
    "cctest-utils.h",
    "collector.h",
    "expression-type-collector-macros.h",
    "feedback-vector-helper.h",
    "heap/heap-tester.h",
    "heap/heap-utils.cc",
    "heap/heap-utils.h",
    "heap/test-alloc.cc",
    "heap/test-array-buffer-tracker.cc",
    "heap/test-compaction.cc",
    "heap/test-concurrent-allocation.cc",
    "heap/test-concurrent-marking.cc",
    "heap/test-external-string-tracker.cc",
    "heap/test-heap.cc",
    "heap/test-incremental-marking.cc",
    "heap/test-mark-compact.cc",
    "heap/test-memory-measurement.cc",
    "heap/test-pool.cc",
    "heap/test-spaces.cc",
    "heap/test-weak-references.cc",
    "heap/test-write-barrier.cc",
    "jsonstream-helper.h",
    "manually-externalized-buffer.h",
    "print-extension.cc",
    "print-extension.h",
    "profiler-extension.cc",
    "profiler-extension.h",
    "test-accessors.cc",
    "test-allocation.cc",
    "test-api-array-buffer.cc",
    "test-api-incumbent.cc",
    "test-api-interceptors.cc",
    "test-api-stack-traces.cc",
    "test-api-typed-array.cc",
    "test-api.cc",
    "test-api.h",
    "test-constantpool.cc",
    "test-cpu-profiler.cc",
    "test-debug-helper.cc",
    "test-debug.cc",
    "test-disasm-regex-helper.cc",
    "test-disasm-regex-helper.h",
    "test-field-type-tracking.cc",
    "test-func-name-inference.cc",
    "test-heap-profiler.cc",
    "test-icache.cc",
    "test-ignition-statistics-extension.cc",
    "test-inobject-slack-tracking.cc",
    "test-js-weak-refs.cc",
    "test-liveedit.cc",
    "test-lockers.cc",
    "test-mementos.cc",
    "test-orderedhashtable.cc",
    "test-profile-generator.cc",
    "test-property-details.cc",
    "test-ptr-compr-cage.cc",
    "test-random-number-generator.cc",
    "test-regexp.cc",
    "test-sampler-api.cc",
    "test-shared-strings.cc",
    "test-smi-lexicographic-compare.cc",
    "test-strings.cc",
    "test-swiss-name-dictionary-infra.cc",
    "test-swiss-name-dictionary.cc",
    "test-trace-event.cc",
    "test-transitions.cc",
    "test-transitions.h",
    "test-typedarrays.cc",
    "test-unscopables-hidden-prototype.cc",
    "test-unwinder-code-pages.cc",
    "test-usecounters.cc",
    "test-utils.cc",
    "test-verifiers.cc",
    "trace-extension.cc",
    "trace-extension.h",
  ]

  if (v8_enable_turbofan) {
    sources += [
      "compiler/codegen-tester.cc",
      "compiler/codegen-tester.h",
      "compiler/function-tester.cc",
      "compiler/function-tester.h",
      "compiler/test-atomic-load-store-codegen.cc",
      "compiler/test-basic-block-profiler.cc",
      "compiler/test-branch-combine.cc",
      "compiler/test-calls-with-arraylike-or-spread.cc",
      "compiler/test-code-assembler.cc",
      "compiler/test-code-generator.cc",
      "compiler/test-concurrent-shared-function-info.cc",
      "compiler/test-gap-resolver.cc",
      "compiler/test-graph-visualizer.cc",
      "compiler/test-instruction-scheduler.cc",
      "compiler/test-instruction.cc",
      "compiler/test-js-constant-cache.cc",
      "compiler/test-js-context-specialization.cc",
      "compiler/test-js-typed-lowering.cc",
      "compiler/test-jump-threading.cc",
      "compiler/test-linkage.cc",
      "compiler/test-loop-analysis.cc",
      "compiler/test-machine-operator-reducer.cc",
      "compiler/test-node.cc",
      "compiler/test-operator.cc",
      "compiler/test-representation-change.cc",
      "compiler/test-run-calls-to-external-references.cc",
      "compiler/test-run-load-store.cc",
      "compiler/test-run-machops.cc",
      "compiler/test-run-stackcheck.cc",
      "compiler/test-run-unwinding-info.cc",
      "compiler/test-run-variables.cc",
      "compiler/test-select-combine.cc",
      "compiler/test-verify-type.cc",
      "setup-isolate-for-tests.cc",
      "setup-isolate-for-tests.h",
      "test-accessor-assembler.cc",
      "test-code-stub-assembler.cc",
      "test-descriptor-array.cc",
      "test-serialize.cc",
      "test-swiss-name-dictionary-csa.cc",
      "torque/test-torque.cc",
    ]
  }

  if (v8_current_cpu == "arm") {
    sources += [
      ### gcmole(arm) ###
      "assembler-helper-arm.cc",
      "assembler-helper-arm.h",
      "test-assembler-arm.cc",
      "test-macro-assembler-arm.cc",
      "test-sync-primitives-arm.cc",
    ]
  } else if (v8_current_cpu == "arm64") {
    sources += [
      ### gcmole(arm64) ###
      "test-assembler-arm64.cc",
      "test-fuzz-arm64.cc",
      "test-javascript-arm64.cc",
      "test-js-arm64-variables.cc",
      "test-sync-primitives-arm64.cc",
      "test-utils-arm64.cc",
      "test-utils-arm64.h",
    ]
    if (is_win) {
      sources += [ "test-stack-unwinding-win64.cc" ]
    }
  } else if (v8_current_cpu == "x86") {
    sources += [
      ### gcmole(ia32) ###
      "test-assembler-ia32.cc",
      "test-log-stack-tracer.cc",
    ]
  } else if (v8_current_cpu == "mips64") {
    sources += [
      ### gcmole(mips64) ###
      "test-assembler-mips64.cc",
      "test-macro-assembler-mips64.cc",
    ]
  } else if (v8_current_cpu == "mips64el") {
    sources += [
      ### gcmole(mips64el) ###
      "test-assembler-mips64.cc",
      "test-macro-assembler-mips64.cc",
    ]
  } else if (v8_current_cpu == "x64") {
    sources += [
      ### gcmole(x64) ###
      "test-log-stack-tracer.cc",
    ]
    if (is_win) {
      sources += [ "test-stack-unwinding-win64.cc" ]
    }
  } else if (v8_current_cpu == "ppc" || v8_current_cpu == "ppc64") {
    sources += [
      ### gcmole(ppc) ###
      "test-assembler-ppc.cc",
    ]
  } else if (v8_current_cpu == "s390" || v8_current_cpu == "s390x") {
    sources += [
      ### gcmole(s390) ###
      "test-assembler-s390.cc",
    ]
  } else if (v8_current_cpu == "riscv64") {
    sources += [
      ### gcmole(riscv64) ###
      "test-assembler-riscv64.cc",
      "test-helper-riscv64.cc",
      "test-macro-assembler-riscv64.cc",
      "test-simple-riscv64.cc",
    ]
  } else if (v8_current_cpu == "riscv32") {
    sources += [
      ### gcmole(riscv32) ###
      "test-assembler-riscv32.cc",
      "test-helper-riscv32.cc",
      "test-macro-assembler-riscv32.cc",
      "test-simple-riscv32.cc",
    ]
  } else if (v8_current_cpu == "loong64") {
    sources += [
      ### gcmole(loong64) ###
      "test-assembler-loong64.cc",
      "test-macro-assembler-loong64.cc",
    ]
  }

  if (v8_use_perfetto) {
    # Perfetto doesn't use TraceObject.
    sources -= [ "test-trace-event.cc" ]
  }

  configs = [
    "../..:cppgc_base_config",
    "../..:external_config",
    "../..:internal_config_base",
    "../..:v8_tracing_config",
    ":cctest_sources_config",
  ]

  public_deps = [
    ":cctest_headers",
    "..:common_test_headers",
    "../../src/inspector:protocol_generated_sources",
    "//build/win:default_exe_manifest",
  ]

  if (v8_enable_webassembly) {
    sources += [
      "../common/wasm/flag-utils.h",
      "../common/wasm/test-signatures.h",
      "../common/wasm/wasm-macro-gen.h",
      "compiler/test-multiple-return.cc",

      # test-run-native-calls uses wasm's LinkageAllocator.
      "compiler/test-run-native-calls.cc",
      "test-js-to-wasm.cc",
      "wasm/test-backing-store.cc",
      "wasm/test-c-wasm-entry.cc",
      "wasm/test-compilation-cache.cc",
      "wasm/test-gc.cc",
      "wasm/test-grow-memory.cc",
      "wasm/test-jump-table-assembler.cc",
      "wasm/test-liftoff-for-fuzzing.cc",
      "wasm/test-liftoff-inspection.cc",
      "wasm/test-run-wasm-64.cc",
      "wasm/test-run-wasm-asmjs.cc",
      "wasm/test-run-wasm-atomics.cc",
      "wasm/test-run-wasm-atomics64.cc",
      "wasm/test-run-wasm-bulk-memory.cc",
      "wasm/test-run-wasm-exceptions.cc",
      "wasm/test-run-wasm-js.cc",
      "wasm/test-run-wasm-memory64.cc",
      "wasm/test-run-wasm-module.cc",
      "wasm/test-run-wasm-relaxed-simd.cc",
      "wasm/test-run-wasm-sign-extension.cc",
      "wasm/test-run-wasm-simd-liftoff.cc",
      "wasm/test-run-wasm-simd.cc",
      "wasm/test-run-wasm-wrappers.cc",
      "wasm/test-run-wasm.cc",
      "wasm/test-streaming-compilation.cc",
      "wasm/test-wasm-breakpoints.cc",
      "wasm/test-wasm-codegen.cc",
      "wasm/test-wasm-import-wrapper-cache.cc",
      "wasm/test-wasm-metrics.cc",
      "wasm/test-wasm-serialization.cc",
      "wasm/test-wasm-shared-engine.cc",
      "wasm/test-wasm-stack.cc",
      "wasm/test-wasm-strings.cc",
      "wasm/test-wasm-trap-position.cc",
      "wasm/wasm-atomics-utils.h",
      "wasm/wasm-run-utils.cc",
      "wasm/wasm-run-utils.h",
      "wasm/wasm-simd-utils.cc",
      "wasm/wasm-simd-utils.h",
    ]
    public_deps += [ "../..:wasm_test_common" ]
  }

  defines = []
  deps = [
    "../..:run_torque",
    "../..:v8_shared_internal_headers",
    "../..:v8_tracing",
  ]

  if (v8_enable_i18n_support) {
    defines += [ "V8_INTL_SUPPORT" ]
    public_deps += [ v8_icu_path ]
  }

  cflags = []
  if (v8_current_cpu == "ppc" || v8_current_cpu == "ppc64" ||
      v8_current_cpu == "arm" || v8_current_cpu == "arm64" ||
      v8_current_cpu == "s390" || v8_current_cpu == "s390x" ||
      v8_current_cpu == "mips64" || v8_current_cpu == "mips64el" ||
      v8_current_cpu == "riscv64" || v8_current_cpu == "loong64" ||
      v8_current_cpu == "riscv32") {
    # Disable fmadd/fmsub so that expected results match generated code in
    # RunFloat64MulAndFloat64Add1 and friends.
    if (!is_win) {
      cflags += [ "-ffp-contract=off" ]
    }
  }

  if (is_win) {
    # This warning is benignly triggered by the U16 and U32 macros in
    # bytecode-utils.h.
    # C4309: 'static_cast': truncation of constant value
    cflags += [ "/wd4309" ]

    # MSVS wants this for gay-{precision,shortest}.cc.
    cflags += [ "/bigobj" ]

    if (symbol_level == 2) {
      sources += [ "test-v8windbg.cc" ]
      deps += [ "../../tools/v8windbg:v8windbg_test" ]
    }
  }

  if (v8_use_perfetto) {
    deps += [
      # TODO(skyostil): Migrate to protozero.
      "//third_party/perfetto/protos/perfetto/trace:lite",
    ]
  }
}
